home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d20 / pvert.arc / QWK.DOC < prev    next >
Text File  |  1992-01-15  |  12KB  |  250 lines

  1.          Within the compressed QWK file are quite a number of other
  2.          component files. We'll start with the one called CONTROL.DAT
  3.          since it is the easiest to describe. It is an ASCII text file
  4.          so if you have one handy, you can follow along.
  5.  
  6.          Generic BBS            ; Line # 1
  7.          Seattle, WA            ; Line # 2
  8.          206-555-1212           ; Line # 3
  9.          Joe Sysop, Sysop       ; Line # 4
  10.          00000,GENBBS           ; Line # 5
  11.          01-01-1991,00:00:00    ; Line # 6
  12.          MARY USER              ; Line # 7
  13.          MENU                   ; Line # 8
  14.          0                      ; Line # 9
  15.          0                      ; Line #10
  16.          254                    ; Line #11
  17.          0                      ; Line #12
  18.          Main Conf              ; Line #13
  19.          ...                    ; Line # x
  20.          254                    ; Line # x
  21.          Last Conf              ; Line # x
  22.          HELLO
  23.          NEWS
  24.          GOODBYE
  25.  
  26.          Line # 1 - This is the BBS name where you got your mail
  27.                     packet.
  28.          Line # 2 - This is the city and state where the BBS is
  29.                     located.
  30.          Line # 3 - This is the BBS phone number.
  31.          Line # 4 - This is the sysop's name.
  32.          Line # 5 - This line contains first the serial number of the
  33.                     mail door followed by the BBS ID. Note the BBS ID
  34.                     as it will be used later in this article.
  35.          Line # 6 - This is the time and date of the packet.
  36.          Line # 7 - This is the uppercase name of the user for which
  37.                     this packet was prepared.
  38.          Line # 8 - This line contains the name of the menu file for
  39.                     those who use the Qmail reader/door. Almost all
  40.                     other mail doors leave this line blank.
  41.          Line # 9 - No one seems to know what this line is meant for.
  42.          Line #10 - No one seems to know what this line is meant for.
  43.                     (Note: Both of these ALWAYS seem to be 0)
  44.          Line #11 - This line is the maximum number of conferences
  45.                     MINUS 1.
  46.          Line #12 - This line is the first conference's number. It is
  47.                     usually 0 but not always.
  48.          Line #13 - This line is the name of the first conference. It
  49.                     is 10 characters or less.
  50.  
  51.          Lines 12 and 13 are repeated for as many conferences as
  52.          listed in line 11.
  53.  
  54.          Anything you see after the last conference name can be
  55.          ignored as that information isn't usually provided by mail
  56.          doors. One exception to this is the Markmail door.
  57.  
  58.  
  59.          Now we'll talk about the message file itself. If you haven't
  60.          guess by now, it is the MESSAGES.DAT file. This is, quite
  61.          obviously, the largest file in the .QWK packet.
  62.  
  63.          MESSAGES.DAT is organized very specifically into 128-byte
  64.          records. The first record is the Sparkware copyright notice.
  65.          The rest of the record after the copyright notice is filled
  66.          with blanks (spaces). To maintain compatibility with Sparky's
  67.          Qmail Door, all mail doors reproduce the copyright notice
  68.          exactly.
  69.  
  70.          Following the first record begins the "meat" of the message
  71.          file. Each message included in the file consists of a header
  72.          followed directly by the message text itself. First we will
  73.          describe the header:
  74.  
  75.           Header    Field
  76.          Position   Length   Description
  77.          --------   ------   ----------------------------------------
  78.          1          1        Message status byte
  79.                                 ' ' = public message which hasn't been
  80.                                       read
  81.                                 '-' = public and already read
  82.                                 '*' = private message
  83.                                 '~' = comment to sysop which hasn't
  84.                                       been read by the sysop
  85.                                 '`' = comment to sysop which HAS been
  86.                                       read by the sysop
  87.                                 '%' = password protected message that
  88.                                       hasn't been read (protected by
  89.                                       sender of message)
  90.                                 '^' = password protected message that
  91.                                       HAS been read (protected by
  92.                                       sender of message)
  93.                                 '!' = password protected message that
  94.                                       hasn't been read (protected by
  95.                                       group password)
  96.                                 '#' = password protected message that
  97.                                       HAS been read (protected by
  98.                                       group password)
  99.                                 '$' = password protected message that
  100.                                       is addressed to ALL (protected
  101.                                       by group password)
  102.          2         7         Message number coded in ASCII
  103.          9         8         Date coded in ASCII (MM-DD-YY)
  104.          17        5         Time coded in ASCII (HH:MM) 24 hour
  105.                              format
  106.          22        25        Uppercase name of person message is TO
  107.          47        25        Uppercase name of person message is FROM
  108.          72        25        Subject of message
  109.          97        12        Message password. Usually not anything
  110.                              but spaces (to denote no password)
  111.          109       8         Message # this message refers to (coded
  112.                              in ASCII)
  113.          117       6         Number of 128-byte chunks in the actual
  114.                              message (includes header and is coded in
  115.                              ASCII)
  116.          123       1         Determines whethere a message is live
  117.                              (active) or killed. 90% of the time you
  118.                              won't see a killed message in a packet.
  119.                                  'a' = Message is active/alive (0xE1)
  120.                                  'b' = Message is killed/dead  (0xE2)
  121.          124       1         Least significant byte of conference
  122.                              number.
  123.          125       1         Most significant byte of conference
  124.                              number. NOTE: This isn't in the original
  125.                              .QWK format but has become the standard
  126.                              due to conference numbers greater than
  127.                              255. In the original format, this byte
  128.                              was space-filled.
  129.          126       3         Filler bytes for future expansion.
  130.                              Space-filled and usually ignored.
  131.  
  132.          Following the header record comes the message text itself.
  133.          The message text is simply the body of the message. To save
  134.          space, the return/linefeed combination is translated to the
  135.          pi character 'c' (0xE3). Note that the last line of the
  136.          message is padded with spaces to fill out the 128-byte
  137.          record.
  138.  
  139.  
  140.          Now we'll talk about the *.NDX files that are included in the
  141.          packet. Each .NDX file is formatted into records of 5-bytes
  142.          each. The bytes in each record are formatted thusly:
  143.  
  144.          Start  Field
  145.          Byte   Length   Description
  146.          ----   ------   --------------------------------------------
  147.          1      4        This is a floating point number in the MSBIN
  148.                          format. This number is the record number of
  149.                          the message header in MESSAGES.DAT that
  150.                          corresponds to this message.
  151.          5      1        This byte is the conferece number of this
  152.                          message. This byte can (and should) be
  153.                          ignored as it is duplicated in the message
  154.                          header in MESSAGES.DAT. This is especially
  155.                          important for conferences numbered higher
  156.                          than 255.
  157.  
  158.          Let's stray just a moment to talk about the MSBIN floating
  159.          point format. This is the format used by the older Microsoft
  160.          Basic compilers and interpreters. Most compiler manufacturers
  161.          have switched to the more efficient IEEE floating point
  162.          format. Therefore, we must have a method of converting to and
  163.          from MSBIN format. Included at the end of this article are
  164.          two routines in C that accomplish this quite easily.
  165.  
  166.  
  167.  
  168.          Ok, let's talk about the format of the .REP (reply) packet.
  169.          Like the .QWK packet it is usually compressed. Inside the
  170.          compressed archive is a file whose extension is .MSG. The
  171.          filename itself is the same as line #5 of CONTROL.DAT. This
  172.          is the BBSID. So, for example, if the BBSID is GENERIC, the
  173.          complete filename in the .REP packet would be GENERIC.MSG.
  174.  
  175.          The format of the .MSG file is almost exactly the same as the
  176.          MESSAGES.DAT file with three differences:
  177.  
  178.          1). In the first record, rather than a copyright notice, the
  179.          first eight bytes are the BBSID as described above. The rest
  180.          of the record is filled with spaces.
  181.  
  182.          2). In the message header, rather than the ASCII-coded
  183.          message number, we have the ASCII-coded conference number
  184.  
  185.          3). Also in the message header, the conference number field
  186.          (byte offset 124 & 125) may be filled with spaces *OR* the
  187.          conference number.
  188.  
  189.  
  190.          /***  MSBIN conversion routines ***/
  191.  
  192.          union Converter
  193.                {
  194.                 unsigned char uc[10];
  195.                 unsigned int  ui[5];
  196.                 unsigned long ul[2];
  197.                 float          f[2];
  198.                 double         d[1];
  199.                }
  200.  
  201.          /* MSBINToIEEE - Converts an MSBIN floating point number */
  202.          /*               to IEEE floating point format           */
  203.          /*                                                       */
  204.          /*  Input: f - floating point number in MSBIN format     */
  205.          /* Output: Same number in IEEE format                    */
  206.  
  207.          float MSBINToIEEE(float f)
  208.          {
  209.             union Converter t;
  210.             int sign, exp;       /* sign and exponent */
  211.  
  212.             t.f[0] = f;
  213.  
  214.          /* extract the sign & move exponent bias from 0x81 to 0x7f */
  215.  
  216.             sign = t.uc[2] / 0x80;
  217.             exp  = (t.uc[3] - 0x81 + 0x7f) & 0xff;
  218.  
  219.          /* reassemble them in IEEE 4 byte real number format */
  220.  
  221.             t.ui[1] = (t.ui[1] & 0x7f) | (exp << 7) | (sign << 15);
  222.             return t.f[0];
  223.          } /* End of MSBINToIEEE */
  224.  
  225.  
  226.          /* IEEEToMSBIN - Converts an IEEE floating point number  */
  227.          /*               to MSBIN floating point format          */
  228.          /*                                                       */
  229.          /*  Input: f - floating point number in IEEE format      */
  230.          /* Output: Same number in MSBIN format                   */
  231.  
  232.          float IEEEToMSBIN(float f)
  233.          {
  234.             union Converter t;
  235.             int sign, exp;       /* sign and exponent */
  236.  
  237.             t.f[0] = f;
  238.  
  239.          /* extract sign & change exponent bias from 0x7f to 0x81 */
  240.  
  241.             sign = t.uc[3] / 0x80;
  242.             exp  = ((t.ui[1] >> 7) - 0x7f + 0x81) & 0xff;
  243.  
  244.          /* reassemble them in MSBIN format */
  245.  
  246.             t.ui[1] = (t.ui[1] & 0x7f) | (sign << 7) | (exp << 8);
  247.             return t.f[0];
  248.          } /* End of IEEEToMSBIN */
  249.  
  250.